#include <iostream>
using std::cout;
using std::endl;
//进行加运算符的重载
//要求：设计一个类，表示复数
// (a + bi) +  (c + di) = (a + c) + (b + d)i
class Complex{
public:
    Complex(int real, int image)
    :_real(real)
    ,_image(image)
    {

    }

    // 1 +2i     1 -3i
    void print(){
        cout << _real << " ";
        if(_image >= 0){
            cout << "+" << _image << "i" << endl;
        }else {
            cout << _image << "i" << endl;

        }
    }

    //成员函数 operator+
    //为什么参数只有一个了呢？？？？
    //因为成员函数的第一个位置永远是this指针
    //虽然现在是一个参数，但是经过编译器处理过后便会成为两个参数
    Complex operator+(const Complex & c2){
        int real = _real + c2._real;
        int image = _image + c2._image;
        Complex result(real, image);
        return result;
    }

private:
    //实部
    int _real;
    //虚部
    int _image;
};
//成员函数的形式
//返回类型  函数名称  函数的参数列表
//编写运算符重载的时候，函数的名称相对是固定的:operatorxxxx

void test(){
    Complex c1(1, 2);
    Complex c2(3, 4);
    Complex c3(1, -1);
    c1.print();
    c2.print();
    c3.print();
    //希望可以实现复数之间的+运算
    //有两种方案，一种基于普通函数，一种基于成员函数
    //编译器帮助我们如何解析处理？
    //Complex c4 = c1.operator+(c2);
    Complex c4 = c1 + c2;
    c4.print();
}

int main()
{
    test();
    return 0;
}

